package cn.highedu.service.impl;

import cn.highedu.entity.Account;
import cn.highedu.mapper.AccountMapper;
import cn.highedu.service.IAccountService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
@Slf4j
public class AccountServiceImpl implements IAccountService {
    @Autowired
    private AccountMapper accountMapper;
    /**
     * 转账方法
     * @param id1    转账账户ID
     * @param id2    目标账户ID
     * @param amount 转账金额
     */
    @Override
    @Transactional// 加入事务管理
    public void transfer(Integer id1, Integer id2, Double amount) {
        // 查询账户A的状态
        Account accountA = accountMapper.getById(id1);
        // 检查账户A是否被冻结
        if (accountA.getStatus() == 0) {
            log.debug("账户{}已被冻结, 不能完成转账", accountA.getName());
            throw new RuntimeException("账户" + accountA.getName() + "已被冻结, 不能完成转账");
        }
        // 检查账户A是否余额充足
        if (accountA.getBalance() < amount) {
            log.debug("账户{}余额不足", accountA.getName());
            throw new RuntimeException("账户" + accountA.getNumber() + "余额不足");
        }
        // 修改账户A的余额
        accountA.setBalance(accountA.getBalance() - amount);
        accountMapper.updateBalance(accountA);

        // 查询账户B的状态
        Account accountB = accountMapper.getById(id2);
        // 检查账户B是否被冻结
        if (accountB.getStatus() == 0) {
            log.debug("账户{}已被冻结, 不能接收转账", accountB.getName());
            throw new RuntimeException("账户" + accountB.getName() + "已被冻结, 不能接收转账");
        }
        // 修改账户B的余额
        accountB.setBalance(accountB.getBalance() + amount);
        accountMapper.updateBalance(accountB);
    }

    /**
     * 批量转账
     * @param ids    账户id的数组 数组的第一个元素是转账账户 其余都是目标账户
     * @param amount 转账金额
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void transfer(Integer[] ids, Double amount) {
        // 获取转账账户
        Integer id = ids[0];
        for (int i = 1; i < ids.length; i++) {
            transfer(id, ids[i], amount);
        }
    }
}
